[genre].tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import clsx from "clsx";
  2. import Link from "next/link";
  3. import { useContext } from "react";
  4. import { useRouter } from "next/router";
  5. import { GetServerSideProps } from "next";
  6. import { Context } from "../../libs/context";
  7. import useGet from "../../utils/hooks/useGet";
  8. import type { ListItem } from "../../types/http";
  9. import NovelItem from "../../components/NovelItem";
  10. import styles from "../../styles/genre.module.scss";
  11. import { get } from "../../utils/http";
  12. const Genre = () => {
  13. const { query } = useRouter();
  14. const { data } = useGet<ListItem[]>(
  15. query.genre ? `/api/genre/${query.genre}` : "/api/list"
  16. );
  17. const store = useContext(Context);
  18. return (
  19. <main className="container">
  20. <h2 className="novel-title">Genres</h2>
  21. <div className={styles.genres}>
  22. <Link
  23. href="/novels"
  24. title="All novels"
  25. className={clsx(styles.genre, {
  26. [styles.current]: !query.genre,
  27. })}
  28. >
  29. All
  30. </Link>
  31. {store.genre.map((item) => (
  32. <Link
  33. href={`/novels/${item.uri}`}
  34. key={item.uri}
  35. title={item.name}
  36. className={clsx(styles.genre, {
  37. [styles.current]: query.genre === item.uri,
  38. })}
  39. >
  40. {item.name}
  41. </Link>
  42. ))}
  43. </div>
  44. <h2 className="novel-title">List</h2>
  45. <ul className="novel-list">
  46. {(data?.data || []).map((item) => (
  47. <NovelItem
  48. key={item.uri}
  49. slug={item.uri}
  50. img={item.img}
  51. name={item.name}
  52. />
  53. ))}
  54. </ul>
  55. </main>
  56. );
  57. };
  58. export const getServerSideProps: GetServerSideProps<
  59. { fallback: { [key: string]: any } },
  60. { genre: string }
  61. > = async ({ params }) => {
  62. const key = params?.genre ? `/api/genre/${params.genre}` : `/api/list`;
  63. const data = await get(key);
  64. return {
  65. props: {
  66. fallback: {
  67. [key]: data,
  68. },
  69. },
  70. };
  71. };
  72. export default Genre;